# # -*- coding: utf-8 -*-
# """
# 手动输入文件（空格分隔）→按第 N 列前 6 位（yyyy-mm）归类
# 输出目录：第一个文件同级目录下的“分类”文件夹
# """
# import os
# import shlex
# from pathlib import Path
#
# import unicodedata
#
# # 全局桶  (year,month) -> [line,...]
# bucket = {}
# # 去重记录数
# unique = 0
# # 设置去重集合
# seen = set()
#
# # ========== 核心：取前 6 位 ===============
# def extract_year_month(value: str):
#     v = value.strip()
#     if len(v) < 6:
#         return '', ''
#     return v[:4], v[4:6]          # ('2025','09')
#
#
# # ========== 单文件处理 ====================
# def process_file(file_path: Path, col_idx: int):
#     global unique  , seen
#     print(f'处理 -> {file_path}')
#     # 当前文件已去重集合
#     with file_path.open(encoding='utf-8') as f:
#         for raw_line in f:
#             raw_line = raw_line.rstrip('\n')
#
#             # 1. 去掉最前面“序号|”
#             #   找到第一个 '|'，把前面那段数字连同 '|' 一起切掉
#             if '|' not in raw_line:
#                 continue
#             no_seq = raw_line.split('|', 1)[1]   # 去掉序号后的内容
#
#             # 2. 去重
#             if no_seq in seen:
#                 unique += 1
#                 continue
#             seen.add(no_seq)
#
#             # 3. 继续原来的年月提取逻辑（用原始行即可，列号不变）
#             parts = raw_line.split('|')
#             if col_idx >= len(parts):
#                 continue
#             year, month = extract_year_month(parts[col_idx])
#             if not (year and month):
#                 continue
#             bucket.setdefault((year, month), []).append(raw_line + '\n')
#
# # ========== 主入口 ========================
# def main():
#     # 1. 一次性读入一行，空格分隔多个路径
#     line = input('请输入文件路径（空格分隔多个路径，回车结束）：\n> ').strip()
#     line = unicodedata.normalize('NFC', line).strip('\u202a\u202b\u200e\u200f')  # 去隐形符
#     if not line:
#         print('未检测到输入！')
#         input('按 Enter 退出...')
#         return
#     # raw_paths = shlex.split(line)
#     raw_paths = [p.strip().strip('"').strip("'") for p in line.split()]
#     files = [Path(p) for p in raw_paths if os.path.isfile(p)]
#
#     if not files:
#         print('未检测到有效文件！')
#         input('按 Enter 退出...')
#         return
#
#     # 2. 统一问一次列号（前 6 位列）
#     while True:
#         try:
#             col = int(input('请输入要提取“前 6 位年月”的字段编号（从 1 开始）：')) - 1
#             if col < 0:
#                 raise ValueError
#             break
#         except ValueError:
#             print('请输入正整数！')
#
#     # 3. 归类
#     for fp in files:
#         process_file(fp, col)
#
#     if not bucket:
#         print('没有提取到任何年月，程序终止。')
#         input('按 Enter 退出...')
#         return
#
#     # 4. 输出根目录 = 第一个文件同级目录 / 分类
#     root = files[0].parent / '去重分类'
#     root.mkdir(exist_ok=True)
#
#     stat_lines = []
#     for (year, month), lines in sorted(bucket.items()):
#         year_dir = root
#         year_dir.mkdir(exist_ok=True)
#         out_file = year_dir / f'{year}-{month}.txt'
#         out_file.write_text(''.join(lines), encoding='utf-8')
#         stat_lines.append(f'{year}-{month}：{len(lines)}\n')
#     stat_lines.append(f'去除重复记录数据：{unique}\n')
#
#     # 5. 统计文件
#     stat_file = root / 'year_month_statistics.txt'
#     stat_file.write_text(''.join(stat_lines), encoding='utf-8')
#
#     print(f'\n完成！共归类 {len(bucket)} 个年月，结果保存在：{root}')
#     input('按 Enter 退出...')
#
#
# if __name__ == '__main__':
#     main()


# -*- coding: utf-8 -*-
"""
手动输入文件路径（空格分隔）→ 按第 N 列前6位 (yyyy-mm) 归类
支持多文件、去重、输出到 "去重分类" 目录
优化：防止内存溢出，适合大文件
"""

import os
import shlex
from pathlib import Path
import unicodedata

# 全局去重集合（只在内存中）
seen = set()
unique_count = 0
# 确定输出文件名称
basename = ''


def extract_year_month(value: str) -> tuple[str, str]:
    """提取字符串前6位作为年月：'202509' -> ('2025', '09')"""
    v = value.strip()
    if len(v) < 6:
        return '', ''
    return v[:4], v[4:6]


def process_file(file_path: Path, col_idx: int, output_root: Path):
    """
    处理单个文件，按年月分类并去重
    输出文件由年月决定，避免内存暴增
    """
    global seen, unique_count

    print(f'处理 -> {file_path}')
    # 打开输出目录下的年月子文件
    year_month_files = {}  # (year, month) -> file object

    with file_path.open(encoding='utf-8') as f:
        for raw_line in f:
            raw_line = raw_line.rstrip('\n')

            # 跳过无 '|' 的行
            if '|' not in raw_line:
                continue

            # 去掉序号部分（第一个 | 之前）
            no_seq = raw_line.split('|', 1)[1].strip()

            # 去重
            if no_seq in seen:
                unique_count += 1
                continue
            seen.add(no_seq)

            # 分割字段
            parts = raw_line.split('|')
            if col_idx >= len(parts):
                continue

            # 提取年月
            year, month = extract_year_month(parts[col_idx])
            if not (year and month):
                continue

            # 获取或创建对应的输出文件句柄
            key = (year, month)
            if key not in year_month_files:
                out_file = output_root / f'{year}-{month}.txt'
                year_month_files[key] = open(out_file, 'a', encoding='utf-8')

            # 写入当前行
            year_month_files[key].write(raw_line + '\n')

    # 关闭所有打开的文件
    for f in year_month_files.values():
        f.close()


def main():
    # 1. 输入文件路径
    line = input('请输入文件路径（空格分隔多个路径，回车结束）：\n> ').strip()
    line = unicodedata.normalize('NFC', line).strip('\u202a\u202b\u200e\u200f')
    if not line:
        print('未检测到输入！')
        input('按 Enter 退出...')
        return

    # 解析路径
    raw_paths = [p.strip().strip('"').strip("'") for p in line.split()]
    files = [Path(p) for p in raw_paths if os.path.isfile(p)]

    if not files:
        print('未检测到有效文件！')
        input('按 Enter 退出...')
        return

    # 2. 输入列号
    while True:
        try:
            col = int(input('请输入要提取“前 6 位年月”的字段编号（从 1 开始）：')) - 1
            if col < 0:
                raise ValueError
            break
        except ValueError:
            print('请输入正整数！')

    # 3. 输出根目录：第一个文件同级目录 / 去重分类
    output_root = files[0].parent / '去重分类'
    output_root.mkdir(exist_ok=True)

    # 4. 逐个处理文件
    for fp in files:
        process_file(fp, col, output_root)

    # 5. 统计结果
    stat_lines = []
    total_months = 0
    for file_path in output_root.glob('*/*.txt'):
        try:
            count = sum(1 for _ in file_path.open())
            month_key = file_path.stem
            stat_lines.append(f'{month_key}：{count}\n')
            total_months += 1
        except Exception as e:
            print(f"读取统计失败: {file_path}, 错误: {e}")

    stat_lines.append(f'去除重复记录数据：{unique_count}\n')
    stat_lines.append(f'共归类 {total_months} 个年月\n')

    # 写入统计文件
    stat_file = output_root / 'year_month_statistics.txt'
    stat_file.write_text(''.join(stat_lines), encoding='utf-8')

    print(f'\n✅ 完成！共归类 {total_months} 个年月，结果保存在：{output_root}')
    input('按 Enter 退出...')


if __name__ == '__main__':
    main()